<?php
/**
 * Created by PhpStorm.
 * User: gogo
 * Date: 18/4/8
 * Time: 下午12:50
 */
namespace app\exception;
use OSS\Core\OssException;
use think\Config;
use think\exception\ClassNotFoundException;
use think\exception\ErrorException;
use think\exception\Handle as ExceptionHandler;
use think\exception\HttpException;
use Exception;
use think\exception\PDOException;
use think\exception\ThrowableError;

class Handle extends ExceptionHandler
{
    public function render(Exception $e)
    {
        $errMessage = Config::load(APP_PATH.'locale/zh-cn.php');
        $debug = Config::get("app_debug");
        $messageKey = strtolower($e->getMessage());
        if ($e instanceof CustomException) {  //自定义错误
            $statusCode = $e->getStatusCode();
            $errmsg = isset($errMessage[$messageKey]) ? $errMessage[$messageKey] : $errMessage["server_invalid"];
            $errno = $errmsg[0];
            $errmsg = $errmsg[1];
            if ($debug) {
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }

            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");
            return json($data);
        } else if ($e instanceof CurlException) {
            $statusCode = 200;
            $errmsg = $e->getMessage();
            $errno = 100000001;
            if ($debug) {
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }
            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");
            return json($data);
        } else if ($e instanceof HttpException) {   //请求方法不存在
            return json([
                "errno"=> "100010",
                "statusCode"=> $e->getStatusCode(),
                "errmsg"=> "API不存在"
            ]);
        } else if ($e instanceof PDOException) {  //数据库错误
            $statusCode = 500;
            $errmsg = $errMessage["server_invalid"];
            $errno = $errmsg[0];
            $errmsg = $errmsg[1];
            if ($debug) {
                $errmsg =  $e->getMessage();
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }

            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");

            return json($data);
        } else if ($e instanceof ThrowableError) {   //语法错误
            $statusCode = 200;
            $errmsg = isset($errMessage[$messageKey]) ? $errMessage[$messageKey] : $errMessage["server_invalid"];
            $errno = $errmsg[0];
            $errmsg = $errmsg[1];
            if ($debug) {
                $errmsg = $e->getMessage();
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }

            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");

            return json($data);
        } else if ($e instanceof ErrorException){
            $statusCode = 200;
            $errmsg = isset($errMessage[$messageKey]) ? $errMessage[$messageKey] : $errMessage["server_invalid"];
            $errno = $errmsg[0];
            $errmsg = $errmsg[1];
            if ($debug) {
                $errmsg = $e->getMessage();
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }

            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");

            return json($data);
        } else if ($e instanceof \InvalidArgumentException) {
            $statusCode = 200;
            $errmsg = isset($errMessage[$messageKey]) ? $errMessage[$messageKey] : $errMessage["server_invalid"];
            $errno = $errmsg[0];
            $errmsg = $errmsg[1];
            if ($debug) {
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }

            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");

            return json($data);
        } else if ($e instanceof \ReflectionException) {
            $statusCode = 200;
            $errmsg = isset($errMessage[$messageKey]) ? $errMessage[$messageKey] : $errMessage["server_invalid"];
            $errno = $errmsg[0];
            $errmsg = $errmsg[1];
            if ($debug) {
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }

            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");

            return json($data);
        } else if ($e instanceof OssException) {
            $statusCode = 200;
            $errmsg = $e->getMessage();

            $errno = "800010";
            if ($debug) {
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }

            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");

            return json($data);
        } else if ($e instanceof ClassNotFoundException) {
            $statusCode = 500;
            $errmsg = $errMessage["server_invalid"];
            $errno = $errmsg[0];
            $errmsg = $errmsg[1];
            if ($debug) {
                $errmsg =  $e->getMessage();
                $line = $e->getLine();
                $file = $e->getFile();
                $trace = $e->getTrace();
            }

            $data = $debug ? compact("errno", "statusCode", "errmsg", "line", "file", "trace") : compact("errno", "statusCode", "errmsg");

            return json($data);
        }

        if ($e instanceof HttpException) {
            return $this->renderHttpException($e);
        } else {
            return $this->convertExceptionToResponse($e);
        }
    }
}